package org.yang.plugins.cloud.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
import org.yang.plugins.cloud.handler.RequestLoggingInterceptor;

/**
 *  web-mvc配置
 *
 * @author: lslands
 * @description:
 * @version：v1.0
 * @date: 2024/5/20 10:47
 */
@Configuration
@EnableWebMvc
public class  WebMvcConfig  implements WebMvcConfigurer{

    @Autowired
    private RequestLoggingInterceptor requestLoggingInterceptor;

    static final String ORIGINS[] = new String[]{"GET","PATCH", "POST", "PUT", "DELETE","OPTIONS"};

    // 跨域配置
    /**
     * 跨域配置会覆盖默认的配置，
     * 因此需要实现addResourceHandlers方法，增加默认配置静态路径
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**")
                .addResourceLocations("classpath:/resources/")
                .addResourceLocations("classpath:/static/");
    }

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry
                // 所有的当前站点的请求地址，都支持跨域访问。
                .addMapping("/**")
                // 所有的外部域都可跨域访问。 如果是localhost则很难配置，因为在跨域请求的时候，外部域的解析可能是localhost、127.0.0.1、主机名
                .allowedOriginPatterns("*")
                // 是否支持跨域用户凭证
                .allowCredentials(true)
                // 当前站点支持的跨域请求类型是什么
                .allowedMethods(ORIGINS)
                //放行哪些原始请求头部信息
                .allowedHeaders("*")
                //暴露哪些原始请求头部信息
                .exposedHeaders("*")
                // 超时时长设置为1小时。 时间单位是秒。
                .maxAge(3600);
    }

    /**
     * 请求耗时拦截器注册
     * @param registry 注册拦截器
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(requestLoggingInterceptor);
    }
}
